home *** CD-ROM | disk | FTP | other *** search
/ Interactive Web Graphics with Shout 3D / Interactive Web Graphics With Shout 3D.iso / mac / Code / Chapter10 / TargetViewpointTestPanel.java < prev   
Text File  |  2000-09-08  |  3KB  |  117 lines

  1. package applets;
  2.  
  3. import shout3d.*;
  4. import shout3d.core.*;
  5. import custom_nodes.*;
  6.  
  7.  
  8. public class TargetViewpointTestPanel extends Shout3DPanel implements DeviceObserver {
  9.    
  10.    
  11.    int pixelStartX;
  12.    int pixelStartY;
  13.    
  14.    float headingSpeed = 0.0f;
  15.    float pitchSpeed = 0.0f;
  16.    float distanceSpeed = 0.0f;
  17.  
  18.    TargetViewpoint cam;
  19.    
  20.  
  21.    public TargetViewpointTestPanel(Shout3DApplet applet){
  22.       super(applet);
  23.    }
  24.       
  25.        public void customInitialize() {
  26.         
  27.       addDeviceObserver(this,"MouseInput", null);
  28.       getRenderer().addRenderObserver(this, null);
  29.       cam = (TargetViewpoint) getCurrentBindableNode("Viewpoint");
  30.    
  31.    }
  32.  
  33.  
  34.    protected void finalize()  { 
  35.       removeDeviceObserver(this,"MouseInput");
  36.       getRenderer().removeRenderObserver(this);
  37.    }
  38.  
  39.    
  40.    
  41.    public boolean onDeviceInput(DeviceInput di, Object userData) {
  42.       MouseInput mi = (MouseInput) di;
  43.       switch (mi.which){
  44.  
  45.          case MouseInput.DOWN:
  46.             pixelStartX = mi.x;
  47.             pixelStartY = mi.y;
  48.             return true;
  49.             
  50.          case MouseInput.UP:
  51.             headingSpeed = 0.0f;
  52.             pitchSpeed = 0.0f;
  53.             distanceSpeed = 0.0f;
  54.             return true;
  55.  
  56.          case MouseInput.DRAG:
  57.  
  58.            //if left button used
  59.            if(mi.button == 0) {
  60.  
  61.             int pixelEndX = mi.x;
  62.             int pixelEndY = mi.y;
  63.  
  64.             int dragDistanceX = pixelEndX - pixelStartX;
  65.             int dragDistanceY = pixelEndY - pixelStartY;
  66.             
  67.             //convert drag to rotation speeds
  68.             //at 1/70 radians/sec for each pixel dragged.
  69. //i.e., dragging 70 pixels creates
  70.             //speed of 1 radian per second 
  71.             headingSpeed = dragDistanceX/70f;
  72.             pitchSpeed = dragDistanceY/70f;
  73.       
  74.       
  75.             return true;
  76.  
  77.             }//end of 0 if
  78.  
  79.            //if right button used
  80.            if(mi.button == 1) {
  81.  
  82.             int pixelEndY = mi.y;
  83.             int dragDistanceY = pixelEndY - pixelStartY;
  84.             
  85.             //convert drag to zoom speed
  86.             //at 1/150 meters/sec for each pixel dragged
  87. //i.e., dragging 150 pixels creates
  88.             //speed of 1 meter per second
  89.             distanceSpeed = dragDistanceY/150f;
  90.       
  91.             return true;
  92.  
  93.             }//end of 1 if
  94.          
  95.       }//end of switch
  96.  
  97.       return false;
  98.  
  99.    }
  100.  
  101.    public void onPreRender (Renderer r, Object o) {
  102.       
  103.       float headingDelta = headingSpeed/getFramesPerSecond();
  104.       float temp = cam.heading.getValue() - headingDelta;
  105.       cam.heading.setValue(temp);
  106.  
  107.       float pitchDelta = pitchSpeed/getFramesPerSecond();      
  108.       temp = cam.pitch.getValue() - pitchDelta;
  109.       cam.pitch.setValue(temp);
  110.       
  111.       float distanceDelta = distanceSpeed/getFramesPerSecond();         
  112.       temp = cam.distance.getValue() + distanceDelta;
  113.       cam.distance.setValue(temp);
  114.    
  115.    }
  116.  
  117. }//end of class